<!DOCTYPE HTML>
<html>
<head><meta name="generator" content="Hexo 3.9.0">
  <meta charset="utf-8">
  
  <title>操作系统 › 但行好事，莫问前程</title>
  <meta name="author" content="fengbo">
  
  <meta name="description" content="不想当架构师的程序员不是好厨师 ，不认为PHP是世界上最好的编程语言的Python开发者不是一个好的Javaer。">
  
  
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">

  <meta property="og:title" content="操作系统">
  <meta property="og:site_name" content="但行好事，莫问前程">

  
    <meta property="og:image" content="undefined">
  

  <link href="/favicon.png" rel="icon">
  <link rel="alternate" href="/atom.xml" title="但行好事，莫问前程" type="application/atom+xml">
  <link rel="stylesheet" href="/css/style.css" media="screen" type="text/css">
  <!--[if lt IE 9]><script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script><![endif]-->
  

</head>
</html>

<body>
  <header id="header"><div class="meta inner">
  <h1><a href="/">但行好事，莫问前程</a></h1>
  <h2><a href="/">CV工程师，了解面向Google编程的基本原理，有三年使用Google经验，在通往程序员的道路上艰难的爬行着。</a></h2>
  <nav id="main-nav">
    <ul>
      
      <li><a href="/">Home</a></li>
      
      <li><a href="/archives">Archives</a></li>
      
      <li><a href="/atom.xml">RSS</a></li>
      
    </ul>
    <div class="clearfix"></div>
  </nav>
</div>
<div class="clearfix"></div>
</header>
  <div id="content" class="inner">
    <div id="main-col" class="alignleft"><div id="wrapper"><article class="post">
  <div class="post-content">
    <header>
      
  
    <h1 class="title">操作系统</h1>
  

      
        <time datetime="2018-09-07T23:53:07.000Z">2018-09-08</time>
      
    </header>
    <div class="entry">
      
        <h3 id="操作系统的引导"><a href="#操作系统的引导" class="headerlink" title="操作系统的引导"></a>操作系统的引导</h3><ol>
<li>开机时，CS=0xFFFF IP=0x0000，所以会跳转到固化在内存中的基本输入输出系统(BIOS)；</li>
<li>BIOS从引导扇区(0磁道0扇区)读取bootsect.s(512k)到内存中。</li>
<li>bootsect.s将操作系统读到内存中。1. 读入setup；2. 在屏幕上打出logo；3. 调用13号中断读取操作系统后面的system部分。</li>
<li>setup完成操作系统启动前的初始化，获取硬件信息如内存的大小等。</li>
<li>setup进入保护模式，然后跳转到system模块的head.s中。</li>
<li>head.s再次初始化GDT表等，然后调用main函数(汇编调用C函数)。</li>
<li>main函数初始化页表等资源，然后阻塞。<a id="more"></a>
</li>
</ol>
<h3 id="操作系统的一些基本概念"><a href="#操作系统的一些基本概念" class="headerlink" title="操作系统的一些基本概念"></a>操作系统的一些基本概念</h3><ul>
<li><b>实模式寻址</b>：CS（段寄存器）左移4位（乘16） + IP（段内偏移）。</li>
<li><b>保护模式寻址</b>：根据CS的值从GDT表中查出基址 + IP。</li>
<li><b>用户态和内核态</b>，硬件保证了用户态不能访问操作系统所在的内存(内核段)，所以程序运行的状态应该是用户态，即不具备访问操作系统内核的权限，如果需要使用操作系统内核，可以调用系统提供的API，即陷入内核。</li>
<li>CPL代表当前进程可以访问的内存的特权级，由CS寄存器的最低2位表示。0代表看看呀访问内核态、3代表只能访问用户态。</li>
<li>DPL存放在GDT表中，用来描述目标内存段的特权级。</li>
<li><b>全局描述符表(GDT)</b>：保护模式所必须的数据结构，存放了段的起始地址、界限、属性等内容。</li>
</ul>
<h2 id="冯洛伊曼体系结构"><a href="#冯洛伊曼体系结构" class="headerlink" title="冯洛伊曼体系结构"></a>冯洛伊曼体系结构</h2><p><img src="/img/计算机体系结构.png"></p>
<h3 id="CPU"><a href="#CPU" class="headerlink" title="CPU"></a>CPU</h3><p>CPU（中央处理器）主要负责解释计算机指令以及处理计算机软件中的数据。CPU主要包含两个基本部分：数据通路和控制器。</p>
<ul>
<li>数据通路：主要用来执行算术逻辑和逻辑运算以及寄存器和存储器的读写控制等。</li>
<li>算术逻辑单元（ALU）：责执行计算机中所有底层的算术操作和逻辑操作。ALU中最基本的部件是加法器，所有的算术运算都可以基于加法运算和逻辑运算来实现。</li>
<li>控制器：用来对指令进行译码，生成相应的控制信号，以控制数据通路进行正确的操作。控制器还负责决定下一步需要取出和执行哪一条指令。</li>
</ul>
<h3 id="存储器-分为内存和外存"><a href="#存储器-分为内存和外存" class="headerlink" title="存储器 - 分为内存和外存"></a>存储器 - 分为内存和外存</h3><ul>
<li>内存包括主存储器和高速缓冲存储器。内存由半导体存储器芯片组成，芯片有多种类型：<ol>
<li>随机存取存储器(RAM)： 包括静态存储器(SRAM)，由六个晶体管构成，一般用作高速缓存；动态存储器(DRAM)，由单个晶体管组成，可以大规模集成，一般用作主存。</li>
<li>只读存储器(ROM)：又称为闪存，不可以更改写入的内容，一般用作基本输入输出系统(BIOS)。</li>
</ol>
</li>
<li>外存包括辅助存储器和海量后备存储器，通常把系统运行时直接和主存交换信息的存储器称为辅助存储器，目前主要的辅存是磁盘存储器和固态硬盘；而磁带和光盘存储器的容量大、速度慢，主要用于信息的备份和脱机存档，因此被用作海量后备存储器。</li>
</ul>
<h3 id="存储器层次结构"><a href="#存储器层次结构" class="headerlink" title="存储器层次结构"></a>存储器层次结构</h3><p>寄存器 –&gt; 高速缓存(SRAM) –&gt; 主存(DRAM) –&gt; 本地磁盘 –&gt; 分布式文件系统、web服务器等。</p>
<ul>
<li>局部性：一个编写良好的计算机程序倾向于引用邻近于其它最近引用过的数据项的数据项，或者最近引用过的数据项本身。<ul>
<li>时间局部性：被引用过一次的内存位置很可能在不远的将来再被多次引用。</li>
<li>空间局部性：一个内存位置被引用了一次，那么程序很可能在不远的将来引用附近的一个内存位置。</li>
</ul>
</li>
<li>强制性缓存不命中：缓存为空的时候，对任何对象都会不命中。</li>
<li>冲突缓存不命中：为了更容易定位缓存中的数据，一般会将第k+1层的某个快限制放置在第k层的一个小的子集中。例如，第k+1层的快0、4、8、12会映射到第k层的块0；块1、5、9、13会映射到块1；以此类推。因此，虽然缓存足够大，能够保持被引用的数据对象，但是因为这些对象会映射到同一个缓存块，缓存会一直不命中。</li>
<li>缓存容量不命中：即缓存太小了。</li>
<li>高速缓存行、组、快<ul>
<li>块：一个固定大小的信息包，在高速缓存和主存之间来回传送。</li>
<li>行：高速缓存中的一个容器，存储块以及其他信息(例如有效位和标记位)。</li>
<li>组：一个或多个行的集合。直接映射高速缓存中的组只由一行组成。组相连和全相连高速缓存中的组是由多个行组成。</li>
</ul>
</li>
</ul>
<h3 id="外部设备"><a href="#外部设备" class="headerlink" title="外部设备"></a>外部设备</h3><p>简称外设，也称为I/O设备。外设通常由机械部分和电子设备部分组成，并且两部分通常是可以分开的。机械部分是即外部设备本身，而电子部分则是控制外部设备工作的I/O控制器或I/O适配器。</p>
<ul>
<li>I/O映像：创建I/O设备的二进制仿真，使其对于CPU而言，看上去就像普通的内存段，屏蔽到不同输入输出设备的差异。</li>
</ul>
<h3 id="总线"><a href="#总线" class="headerlink" title="总线"></a>总线</h3><p>总线是传输信息的介质，用于在部件之间传输信息，CPU、主存和I/O模块通过总线互联。</p>
<ul>
<li>地址总线：CPU通过地址总线指定存储单元，地址总线的宽度决定了存储器的大小。</li>
<li>数据总线：负责CPU和内存或其他器件之间的数据传输，数据总线的宽度决定了CPU和外界的数据传输速度。</li>
<li>控制总线：负责CPU对外部器件的控制，控制总线的宽度决定了CPU可以对外部器件提供的控制数。</li>
<li>内部总线：负责连接CPU内部各个器件进。</li>
</ul>
<h2 id="进程管理"><a href="#进程管理" class="headerlink" title="进程管理"></a>进程管理</h2><p>一个正在执行的程序称为一个进程，它包括程序计数器、寄存器和变量的当前值。进程管理部件的最主要任务是进程的创建和终止。它还包括一个进程调度器，负责选择下一步运行哪个进程或线程。</p>
<ul>
<li>进程的切换 = 指令序列的切换 + 资源的变更</li>
<li>线程的切换 = 指令序列的切换：即多个线程使用同一片虚拟内存<ul>
<li>用户态线程切换：整个过程类似于函数调用，只是切换了不同的栈，即每个进程都有一个自己的栈，并将栈信息保存在TCB中，切换时调用Yield函数根据TCP中的值修改esp寄存器的值就行。用户态线程切换无法使用到多核和多处理器。</li>
<li>内核态线程切换：需要切换一套栈，一套栈包括一个内核栈和一个用户栈。</li>
</ul>
</li>
</ul>
<h3 id="进程挂起"><a href="#进程挂起" class="headerlink" title="进程挂起"></a>进程挂起</h3><p>一个进程暂时被这样挂起后，在随后的某个时刻里，该进程再次启动时的状态必须与先前暂停时完全相同，这就意味着在挂起时该进程的所有信息都要保存下来。例如，为了同时读入信息，进程打开了若干文件。同每个被打开文件有关的是指向当前位置的指针（即下一个将读出的字节或记录）。在一个进程暂时被挂起时，所有这些指针都必须保存起来，这样在该进程重新启动之后，所执行的读调用才能读到正确的数据。在许多操作系统中，与一个进程有关的所有信息，除了该进程自身<br>地址空间的内容以外，均存放在操作系统的一张表中，称为进程表（process table），进程表是数组（或链表）结构，当前存在的每个进程都要占用其中一项。</p>
<h3 id="进程的资源集"><a href="#进程的资源集" class="headerlink" title="进程的资源集"></a>进程的资源集</h3><p>操作系统维护了一张进程i表，表中包含了寄存器（含有程序计数器和堆栈指针）、打开的文件的清单、突出的报警、有关进程清单，以及运行该程序所需要的所有其他信息。</p>
<h3 id="PCB和TCB"><a href="#PCB和TCB" class="headerlink" title="PCB和TCB"></a>PCB和TCB</h3><ul>
<li>进程控制块(PCB)：操作系统为了管理进程设置的一个专门的数据结构。主要保存了：<ul>
<li>进程状态：可以使new、ready、running、waiting或halted等。</li>
<li>程序计数器：接着要运行的指令地址。</li>
<li>CPU寄存器：如累加器、索引寄存器（Index Register）、堆栈指针以及一般用途寄存器、状况代码等，主要用途在于中断时暂时存储数据，以便稍后继续利用；其数量及类因计算机架构有所差异。</li>
<li>CPU排班法：优先级、排班队列等指针以及其他参数。</li>
<li>存储器管理：如分页表（Page Table）等。</li>
<li>会计信息：如CPU与实际时间之使用数量、时限、帐号、工作或进程号码。</li>
<li>输入输出状态：配置进程使用I/O设备，如磁带机。</li>
</ul>
</li>
<li>线程控制块(TCB)：与进程的控制块相似的子控制块。</li>
</ul>
<h3 id="多处理器和多核"><a href="#多处理器和多核" class="headerlink" title="多处理器和多核"></a>多处理器和多核</h3><ul>
<li>多处理器指多个独立的CPU，每个CPU都有较为独立的电路支持，有自己的Cache，有自己的MMU，而它们之间通过总线进行通信。在这个架构上跑多线程程序（常见的典型情况），不考虑超线程，那么每一个线程都要跑在一个独立的CPU上，线程间的所有写作都要走总线，而共享的数据可能在好几个Cache中同时存在。</li>
<li>多核单CPU只需要一套芯片组、一套存储，多核之间通过芯片内部总线进行通信，共享使用内存。</li>
<li>内存管理单元(MMU)：CPU用来管理虚拟存储器、物理存储器的控制线路，同时也负责将虚拟地址映射为物理地址，以及提供硬件机制的内存访问授权。</li>
</ul>
<h3 id="线程的实现方法"><a href="#线程的实现方法" class="headerlink" title="线程的实现方法"></a>线程的实现方法</h3><ol>
<li>在用户空间中实现线程，对于内核来说直接按正常的方式进行管理，即单线程进程。<ul>
<li>优点：</li>
</ul>
<ol>
<li>跨平台，即用户级线程包可以在不支持线程的操作系统上实现。</li>
<li>轻量级，不需要陷入内核，不需要上下文切换，也不需要对内存高速缓存进行刷新，这就使得线程调度非常快捷。</li>
<li>允许每个进程有自己定制的调度算法。</li>
</ol>
<ul>
<li>缺点：无法使用内核提供的如阻塞等基本功能，即当某个线程调用和阻塞方法时可能导致该进程中所有的线程阻塞。</li>
</ul>
</li>
<li>在内核中实现线程，由内核来完成线程切换，内核通过操纵调度器对线程进行调度。可以使用内核提供的各种功能，但是创建代价比较大。</li>
<li>混合实现：试图将用户级线程的优点和内核级线程的优点结合起来的方法。</li>
</ol>
<h2 id="内存管理"><a href="#内存管理" class="headerlink" title="内存管理"></a>内存管理</h2><p>存储管理任务包括维护虚拟内存到物理内存的映射，维护最近被访问页面的缓存以及实现一个好的页面置换算法，并且根据需要把需要的数据和代码页读入到内存中。<br>操作系统在内存中寻找一块空闲的内存空间，将这一段内存的基地址放入PCB中，将程序载入进去，然后进行内存重定位。</p>
<h3 id="内存重定位"><a href="#内存重定位" class="headerlink" title="内存重定位"></a>内存重定位</h3><p>程序中的地址都是逻辑地址，即一般都是从0地址开始，实际运行时需要将其翻译成物理地址，即在内存中的实际地址。可以在编译、载入或运行时进行重定位，PC机一般是运行时重定位。</p>
<ul>
<li>编译时重定位的程序只能放在内存中固定位置，所以效率高，一般嵌入式设备使用这种方式。</li>
<li>载入时重定位的程序一旦载入到内存中就不能再移动了。</li>
<li>运行时重定位的程序可以在运行时进行交换，即将长时间阻塞的进程换出，腾出内存空间。运行时重定位的物理内存 = 基地址(放在PCB中) + 逻辑地址。</li>
</ul>
<h3 id="内存分段"><a href="#内存分段" class="headerlink" title="内存分段"></a>内存分段</h3><p>程序一般分为不同的段（程序段、数据段、堆栈段等），每个段分别找到空闲的内存，将该内存的基地址存入段表，然后将该段程序裁人内存。所以程序的地址 = 段地址 + 段内偏移。而PCB中存储的也不在是基地址，而是段表（LDT表），GDT表就是类似操作系统对应的段表。</p>
<h3 id="内存分页（如何在内存中找到一块空闲的区域）"><a href="#内存分页（如何在内存中找到一块空闲的区域）" class="headerlink" title="内存分页（如何在内存中找到一块空闲的区域）"></a>内存分页（如何在内存中找到一块空闲的区域）</h3><p>将物理内存分成大小相同的页，这样不会因为内存不断的划分出现内存碎片问题。但是需要在内存中维护一个页表。该表由MMU维护。</p>
<h3 id="虚拟内存"><a href="#虚拟内存" class="headerlink" title="虚拟内存"></a>虚拟内存</h3><p>虚拟内存是计算机系统内存管理的一种技术。它使得程序认为自己拥有连续可用的内存（一个连续完整的地址空间）。而实际上，它通常被分隔成多个物理内存碎片（分页、分段），还有部分暂时存储在外部磁盘存储器上，在需要时进行数据交换。<br>具体实现就是将磁盘划出一部分来当做内存使用，当虚拟内存空间中实际用到的内存大于物理内存时就可能发生缺页，这时候就需要将一部分内存换出到磁盘上，同时将缺页部分换入到内存中。</p>
<ul>
<li>内存换入：把准备好竞争CPU运行的程序从辅存移到内存。</li>
<li>内存换出：把处于等待状态（或在CPU调度原则下被剥夺运行权利）的程序从内存移到侧畔，把内存空间腾出来。</li>
</ul>
<h2 id="文件系统"><a href="#文件系统" class="headerlink" title="文件系统"></a>文件系统</h2><p>在Linux操作系统中，所有的I/O设备（例如网络、磁盘和终端）都被模型化为文件，而所有的输入和输出都被当做对相应文件的读和写来执行。 </p>
<h3 id="文件操作过程"><a href="#文件操作过程" class="headerlink" title="文件操作过程"></a>文件操作过程</h3><ol>
<li>打开文件：一个应用程序通过要求内核打开相应的文件，来宣告它要访问一个I/O设备。内核返回一个称为<b>描述符</b>的小的非负整数，它在后续对此文件的所有操作中标识这个文件。 </li>
<li>Linux shell创建的每个进程开始时都打开了三个文件：标志输入（描述符为0）、标志输出（描述符为1）和标志称为（描述符为2）。 </li>
<li>改变当前的文件位置：对于每个打开的文件，内核保持一个<b>文件位置k</b>，初始值为0。这个文件位置是从文件开头起始的<b>字节偏移量</b>。应用程序可以通过执行seek操作，显示的设置当前位置为k。 </li>
<li>读写文件：一个读操作就是从文件复制n&gt;0个字节到内存，从当前文件位置k开始，然后将k增加为k+n。给定一个大小为m字节的文件，当k大于等于m时执行读操作会触发一个end-of-file（EOF）的条件，应用程序能检测到这个条件。在文件结尾并没有明确的EOF符号。</li>
<li>关闭文件：当应用完成对文件的访问后，就通知内核关闭这个文件。作为响应，内核释放文件打开的创建的数据结构，并将这个描述符恢复到可用的描述符池中。无论一个进程因为何种原因终止时，内核都会关闭所有打开的文件并释放它们的内存资源。</li>
</ol>
<h3 id="文件在内核中的表示"><a href="#文件在内核中的表示" class="headerlink" title="文件在内核中的表示"></a>文件在内核中的表示</h3><ol>
<li>描述符表：每个进程都有它独立的描述符表，它的表项由进程打开的文件描述符来索引。每个打开的文件描述符表项指向文件表中的一个表项。</li>
<li>文件表：打开文件的集合是由一张文件表来表示的，所有的进程共享这张表。每个文件表的表项由当前的文件位置、引用计数（即当前指向该表项的描述符表项数），以及一个指向v-node表中对应表项的指针。关闭一个描述符会减少相应的文件表表项中的引用计数。内核不会删除这个文件表的表项，直到他的引用计数为零。</li>
<li>v-node表：同文件表一样，所有进程共享这张表。每个表项包含stat结构中的大多数信息，包括st_mode和st_size。</li>
</ol>

      
    </div>
      
      <footer>
        
        
  
  <div class="tags">
    <a href="/tags/计算机基础/">计算机基础</a>
  </div>

        
  <div class="addthis addthis_toolbox addthis_default_style">
    
      <a class="addthis_button_facebook_like" fb:like:layout="button_count"></a>
    
    
      <a class="addthis_button_tweet"></a>
    
    
      <a class="addthis_button_google_plusone" g:plusone:size="medium"></a>
    
    
      <a class="addthis_button_pinterest_pinit" pi:pinit:layout="horizontal"></a>
    
    <a class="addthis_counter addthis_pill_style"></a>
  </div>
  <script type="text/javascript" src="//s7.addthis.com/js/300/addthis_widget.js"></script>

      
      <div class="clearfix"></div>
      </footer>
  </div>
</article>

<!-- 来必力City版安装代码 -->
<!-- <div id="lv-container" data-id="city" data-uid="MTAyMC8yOTQ5MS82MDU5">
<script type="text/javascript">
   (function(d, s) {
       var j, e = d.getElementsByTagName(s)[0];

       if (typeof LivereTower === 'function') { return; }

       j = d.createElement(s);
       j.src = 'https://cdn-city.livere.com/js/embed.dist.js';
       j.async = true;

       e.parentNode.insertBefore(j, e);
   })(document, 'script');
</script>
<noscript>为正常使用来必力评论功能请激活JavaScript</noscript>
</div> -->
<!-- City版安装代码已完成 -->

</div></div>
    <aside id="sidebar" class="alignright">
  
<div class="widget tagcloud">
  <h3 class="title">文章分类</h3>
  <div class="entry">
    <a href="/tags/JavaWeb/" style="font-size: 17.14px;">JavaWeb</a> <a href="/tags/Java基础/" style="font-size: 15.71px;">Java基础</a> <a href="/tags/Java高级特性/" style="font-size: 15.71px;">Java高级特性</a> <a href="/tags/Python/" style="font-size: 10px;">Python</a> <a href="/tags/Spring基础/" style="font-size: 14.29px;">Spring基础</a> <a href="/tags/WebRTC/" style="font-size: 10px;">WebRTC</a> <a href="/tags/其它/" style="font-size: 20px;">其它</a> <a href="/tags/分布式/" style="font-size: 11.43px;">分布式</a> <a href="/tags/硬件/" style="font-size: 12.86px;">硬件</a> <a href="/tags/计算机基础/" style="font-size: 18.57px;">计算机基础</a> <a href="/tags/设计模式/" style="font-size: 17.14px;">设计模式</a>
  </div>
</div>



    <div class="widget tagcloud">
    <h3 class="title">电子书</h3>
    <ul class="entry">
      <li class='link'><a href='http://www.duokan.com/' target="_blank">多看阅读</a>&nbsp;&nbsp;<a href='https://read.douban.com/' target="_blank">豆瓣阅读</a>&nbsp;&nbsp;<a href='http://e.dangdang.com/' target="_blank">当当阅读</a></li>
      <li class='link'><a href='http://www.ituring.com.cn/' target="_blank">图灵社区</a>&nbsp;&nbsp;<a href='https://www.epubit.com/' target="_blank">异步社区</a>&nbsp;&nbsp;<a href='https://www.geekbang.org/' target="_blank">极客空间</a></li>
    </ul>
  </div>


  
  <div class="widget tag">
    <h3 class="title">友情链接</h3>
      <ul class="entry">
        
          <li class='link'><a href='http://www.cnblogs.com/jietang/' target="_blank">唐洁的博客</a></li>
        
          <li class='link'><a href='http://rednaxelafx.iteye.com/' target="_blank">R大的博客</a></li>
        
          <li class='link'><a href='http://www.hollischuang.com/' target="_blank">阿里大神的博客</a></li>
        
          <li class='link'><a href='http://blog.csdn.net/IT_faquir/' target="_blank">IT_faquir的专栏</a></li>
        
      </ul>
  </div>


  
  <div class="widget tag">
    <h3 class="title">思维导图</h3>
      <ul class="entry">
        
          <li class='link'><a href='https://fengbo4213.github.io/img/开源协议.png' target="_blank">开源协议简介</a></li>
        
          <li class='link'><a href='https://www.processon.com/diagraming/5b0cf757e4b009aef58d4b9d' target="_blank">我的知识体系</a></li>
        
          <li class='link'><a href='https://www.processon.com/view/link/5a2a00e5e4b015e677290b4f' target="_blank">简单的网站架构</a></li>
        
      </ul>
  </div>


  
  <div class="widget tag">
    <h3 class="title">在线手册</h3>
      <ul class="entry">
        
          <li class='link'><a href='http://v3.bootcss.com/' target="_blank">BootStrap官方手册</a></li>
        
          <li class='link'><a href='http://www.iconfont.cn/http://element.eleme.io/#/zh-CN/' target="_blank">阿里巴巴矢量图标库</a></li>
        
      </ul>
  </div>


  
<div class="widget tag">
  <h3 class="title">最新文章</h3>
  <ul class="entry">
    
      <li>
        <a href="/2123/08/30/基础之MySQL原理/">MySQL原理</a>
      </li>
    
      <li>
        <a href="/2024/01/01/其它之ClickHouse索引/">ClickHouse索引</a>
      </li>
    
      <li>
        <a href="/2023/12/17/其它之MySQL线程池/">MySQL线程池</a>
      </li>
    
      <li>
        <a href="/2023/12/16/其它之InnoDB性能优化基础/">InnoDB性能优化基础</a>
      </li>
    
      <li>
        <a href="/2023/12/03/其它之Java8之后的版本新特性/">Java8之后的版本新特性</a>
      </li>
    
  </ul>
</div>

</aside>
    <div class="clearfix"></div>
  </div>
  <footer id="footer" class="inner"><div class="alignleft">
  
  &copy; 2024 fengbo
  
</div>
<div class="clearfix"></div></footer>
  <script src="https://code.jquery.com/jquery-2.2.4.min.js"></script>



</body>
</html>

